/****************************************Copyright (c)****************************************************

**--------------File Info---------------------------------------------------------------------------------
** File name:                kalmanfilter.h
** Last modified Date:       2024.12.22
** Last Version:             Ver:1.1
** Descriptions:             卡尔曼滤波驱动
**                           重写了V1.0版驱动代码，使用面向对象的编程方式，减少了程序间的耦合度。
**
**--------------------------------------------------------------------------------------------------------
** Created by:               adm
** Created date:             2024.11.15
** Version:                  Ver:1.0
** Descriptions:             使用本驱动，需要调用math库
**--------------------------------------------------------------------------------------------------------*/

/**
使用方法；
1、初始化滤波器参数
	KalmanFilter_Init(2, 2, 0.01);      //V1.1版驱动无需调用初始化函数，滤波器参数初始化工作放到滤波器对象定义中完成。
2、放入测量值，通过滤波函数计算出滤波结果
	estimated_value = updateEstimate(measured_value);
mea_e   取值越大，滤波结果越平稳，但是初始值到平稳值过度也越缓慢
est_e   取值越大，初始值到平稳值过度越快，但是滤波结果跳动误差也变大
q       取值越大，初始值到平稳值过度越快，但是滤波结果跳动误差也变大
*/
#ifndef KALMANFILTER_H
#define KALMANFILTER_H

#include "at32f415_wk_config.h"

typedef struct KalmanFilter{
	/* 滤波器参数变量 */
	float _err_measure;         //测量误差
	float _err_estimate;        //估计误差
	float _q;                   //噪声方差
	float _current_estimate;    //当前估计值
	float _last_estimate;       //上一次估计值
	float _kalman_gain;         //卡尔曼滤波器增益
	/* 滤波器API函数 */
	float (*updateEstimate)(struct KalmanFilter* kf, float mea);
	void (*setMeasurementError)(struct KalmanFilter* kf, float mea_e);
	void (*setEstimateError)(struct KalmanFilter* kf, float est_e);
	void (*setProcessNoise)(struct KalmanFilter* kf, float q);
	float (*getKalmanGain)(struct KalmanFilter* kf);
}KalmanFilter_t;

//滤波器对象外部声明
extern KalmanFilter_t KalmanFilter_voltage;
extern KalmanFilter_t KalmanFilter_A_temperature;
extern KalmanFilter_t KalmanFilter_B_temperature;
extern KalmanFilter_t KalmanFilter_A_humidity;
extern KalmanFilter_t KalmanFilter_B_humidity;	

#endif
